<?php

namespace Org\Util;
/**
 * token防止表单重复提交
 * Class Token
 * @package Org\Util
 */
define('SALT',"http://".$_SERVER['SERVER_NAME']);
class Token {
    static $ttl = 7200;   #很重要，不要太短，看表单用途修改issueCrumb()过期时间
    /** 生成加密串，可以添加到表单中
     * @param $uid  用户ID
     * @param int $action
     * @return bool|string
     */
    static public function issueCrumb($uid, $ttl, $action=-1)
    {
        if (intval($ttl>7200)) self::$ttl = $ttl;
        $i=ceil(time() / self::$ttl);
        return substr(self::challenge($i.$action.$uid),-12,10);
    }

    /** 解密
     * @param $uid
     * @param $crumb  加密时 Crumb::issueCrumb($uid)生成的字串。
     * @param int $action
     * @return bool
     */
    static public function verifyCrumb($uid,$crumb,$action=-1)
    {
        $i=ceil(time() / self::$ttl);
        if ( substr(self::challenge($i.$action.$uid),-12,10)==$crumb ||substr(self::challenge(($i - 1) . $action . $uid), -12, 10) == $crumb) {
            return true;
        }
        return false;
        
    }

    //内用
    static public function challenge($data){
        return hash_hmac('md5',$data,SALT);
    }
}